// https://leetcode.cn/problems/wtcaE1/submissions/496246418/

// 使用双指针,left和right，right负责遍历整个字符串，存储字符串对应的索引
// 当发现right指向的字符串和left指向的字符串相同时，这个时候可以得出从第left开始的最长无重复字符串的长度
// 然后将left向右移动一个，再求下一个位置的最长字符串，最终将最大值返回出去

function lengthOfLongestSubstring(s: string): number {
    const n = s.length;
    // 存储字符串以及对应的索引
    const map = new Map<string,number>()
    // 1.定义用到的变量
    let left = 0;
    let maxLength = 0;

    for (let right = 0; right < n; right++){
        // 拿到每一项
        const rightChar = s[right];
        // 如果发现map中含有当前项，且当前项的索引比left对应的索引大或者在left索引之后
        if(map.has(rightChar) && map.get(rightChar)! >= left){
            // 将left指针在当前项的基础上后移一位
            left = map.get(rightChar)! + 1;
        }
        // 存储遍历到的所有项
        map.set(rightChar, right)
        // 计算左指针到右指针的当前最大长度
        const curLength = right - left + 1;
        // 将当前最大长度和之前的最大长度进行对比，取出更大长度
        maxLength = Math.max(maxLength, curLength)
    }

    return maxLength;
};

console.log(lengthOfLongestSubstring("abcabcbb"))
console.log(lengthOfLongestSubstring("bbbbb"))

export default {};